package com.v2.k21;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 测试jdk内置的动态代理
 *
 * JDK动态代理是基于接口的方式，换句话来说就是代理类和目标类都实现同一个接口，那么代理类和目标类的方法名就一样了；
 * CGLib动态代理是代理类去继承目标类，然后重写其中目标类的方法啊，这样也可以保证代理类拥有目标类的同名方法；
 */
public class Test {

	public static void main(String[] args) {

		//1. JDK动态代理
		TestProxyService testProxyService = new TestProxyService(); //目标对象
		TestProxyInterface proxyInstance = (TestProxyInterface) Proxy.newProxyInstance(TestProxyService.class.getClassLoader(),
				TestProxyService.class.getInterfaces(), new InvocationHandler() {
			@Override
			//参数Object proxy就是proxyInstance，
			//参数Method method就是fun1()，
			//参数Object[] args 就是fun1()方法的参数
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				System.out.println("代理逻辑前...");
				Object obj = method.invoke(testProxyService, args); //在代理逻辑中可以执行目标对象的方法
				System.out.println("代理逻辑后...");
				return obj;
			}
		}); //代理对象
		proxyInstance.fun1();

	}

}
